#include "bsp_sht20.h"
#include "i2c.h"

volatile SHT20_TemRH_Val gTemRH_Val; // 存储温湿度值

uint16_t BSP_SHT20_Read(uint8_t sht20_cmd)
{
    uint16_t sht20_reg_val = 0;
    uint8_t sht20_reg_buff[2] = {0x00, 0x00}; // 只读取2个字节数据

    // 发送控制指令
    if (HAL_I2C_Master_Transmit(&hi2c1, SHT20_ADDR_WRITE, &sht20_cmd, 1, 100) != HAL_OK)
    {
        // 错误处理：通信失败
        return 0xFFFF; // 返回错误值
    }

    // 适当增加延时，等待测量完成
    HAL_Delay(85); // 高分辨率模式下，温度测量最大时间

    // 读取数据
    if (HAL_I2C_Master_Receive(&hi2c1, SHT20_ADDR_READ, sht20_reg_buff, 2, 100) != HAL_OK)
    {
        // 错误处理：通信失败
        return 0xFFFF; // 返回错误值
    }

    sht20_reg_val = (sht20_reg_buff[0] << 8) | sht20_reg_buff[1];
    return sht20_reg_val;
}

void BSP_SHT20_GetData(void)
{
    uint16_t pTem = 0, pHum = 0;

    // 读取温湿度数据
    pTem = BSP_SHT20_Read(SHT20_HOLD_M_READ_T);
    pHum = BSP_SHT20_Read(SHT20_HOLD_M_READ_RH);

    if (pTem == 0xFFFF || pHum == 0xFFFF)
    {
        // 错误处理：数据读取失败
        return;
    }

    // 数据转换
    gTemRH_Val.Tem = -46.85f + 175.72f * ((float)pTem / 65536);
    gTemRH_Val.Hum = -6 + 125 * ((float)pHum / 65536);
}